# encoding: UTF-8

class Usuarios::MedicoController < ApplicationController

  before_filter :verifica_administrador, :only => [:novo, :criar, :remover]
  before_filter :verifica_administrador_medico, :only => [:editar, :atualizar]
  before_filter :verifica_administrador_paciente_medico, :only => [:visualizar]
  before_filter :verifica_administrador_paciente, :only => [:listar]
  before_filter :verifica_medico, :only => [:editar_foto, :atualizar_foto]

  layout "application"
  
  def novo
    @medico = Usuarios::Medico.new()
  end
  
  def criar
    @medico = Usuarios::Medico.new(params[:medico])
    # O sistema cria a senha automaticamente, o administrador não tem conhecimento dela
    nova_senha = (0...8).map{65.+(rand(25)).chr}.join
    @medico.senha = nova_senha
    @medico.confirmacao_senha = nova_senha

    respond_to do |format|
      if @medico.criar
        # Notifica usuario sobre novo cadastro
        UsuarioMailer.novo_cadastro(@medico, nova_senha).deliver

        Log.create(:login => @usuario_logado.login, :mensagem => t('usuarios/medico.create_success') + " (#{@medico.login})")
        flash[:notice] = t('usuarios/medico.create_success')
        format.html {redirect_to :action => :listar}
        format.js {
          render :update do |page|
            page.redirect_to(:action => :listar)
          end
        }
      else
        format.html {redirect_to :action => :listar, :alert => t('usuarios/medico.create_fail')}
        format.js {
          render :update do |page|
            page.select('.erro_form').each do |div|
              div.hide
            end
            page.select('.noicon').each do |div|
              div.hide
            end
            @medico.errors.each do |atributo, erro|
              page.replace_html("erro_#{atributo}", erro)
              page.show("erro_#{atributo}")
              page.show("noiconid_#{atributo}")
            end
            page << "loaded();"
          end
        }
      end
    end
  end
  
  def editar
    # Controle para que o medico só seja capaz de se editar
    if @medico_logado
      @medico = @medico_logado
    else
      @medico = Usuarios::Medico.buscar_ativos(:id => params[:id]).first
    end

    if @medico
      @medico.confirmacao_senha = @medico.senha
    else
      flash[:alert] = t('usuarios/medico.not_found')
      redirect_to :action => :listar
    end
  end
  
  def editar_foto
    # O filtro garante que apenas medicos logados acessem
    @medico = @medico_logado
  end

  def atualizar_foto
    # Ação disparada apenas por medicos
    if @medico_logado.id.to_s == params[:medico][:id]
      foto_io = params[:foto]
      if foto_io
        foto_jpg_path = Rails.root.join("app", "assets", "images", "medicos", "foto_medico_#{@medico_logado.id}.jpg")
        foto_png_path = Rails.root.join("app", "assets", "images", "medicos", "foto_medico_#{@medico_logado.id}.png")

        if foto_io.content_type == "image/png"
          if File.exist?(foto_jpg_path)
            File.delete(foto_jpg_path)
          end
          File.open(foto_png_path, 'wb') do |arquivo| 
            arquivo.write(foto_io.read)
          end
          flash[:notice] = t('usuarios/medico.update_success')
        elsif foto_io.content_type == "image/jpeg"
          if File.exist?(foto_png_path)
            File.delete(foto_png_path)
          end
          File.open(foto_jpg_path, 'wb') do |arquivo| 
            arquivo.write(foto_io.read)
          end
          flash[:notice] = t('usuarios/medico.update_success')
        else
          flash[:alert] = t('usuarios/medico.update_fail')
        end
      end
    else
      flash[:alert] = t('usuarios/medico.update_fail')
    end
    redirect_to :action => :visualizar
  end

  def atualizar
    # Controle para que o medico só seja capaz de se atualizar
    if @medico_logado
      @medico = @medico_logado
      params[:medico][:id] = @medico_logado.id.to_s # Impede que seja forçado um novo id
    else
      @medico = Usuarios::Medico.buscar_ativos(:id => params[:medico][:id]).first
      params[:medico][:senha] = nil # Impede que seja forçada uma nova senha
    end

    respond_to do |format|
      if @medico
        params[:medico][:login] = @medico.login # Impede que seja forçado um novo login
        if @medico.atualizar(params[:medico])
          Log.create(:login => @usuario_logado.login, :mensagem => t('usuarios/medico.update_success') + " (#{@medico.login})")
          flash[:notice] = t('usuarios/medico.update_success')
          if @medico_logado
            format.html {redirect_to :action => :visualizar}
            format.js {
              render :update do |page|
                page.redirect_to(:action => :visualizar)
              end
            }
          else # Se for administrador, redireciona para lista de medicos
            format.html {redirect_to :action => :listar}
            format.js {
              render :update do |page|
                page.redirect_to(:action => :listar)
              end
            }
          end
        else
          format.html {redirect_to :action => :listar, :alert => t('usuarios/medico.update_fail')}
          format.js {
            render :update do |page|
              page.select('.erro_form').each do |div|
                div.hide
              end
              page.select('.noicon').each do |div|
                div.hide
              end
              @medico.errors.each do |atributo, erro|
                page.replace_html("erro_#{atributo}", erro)
                page.show("erro_#{atributo}")
                page.show("noiconid_#{atributo}")
              end
              page << "loaded();"
            end
          }
        end
      else
        flash[:alert] = t('usuarios/medico.not_found')
        format.html {redirect_to :action => :listar}
        format.js {
          render :update do |page|
            page.redirect_to(:action => :listar)
          end
        }
      end
    end
  end
  
  def listar
    if params[:filtro]
      @medicos = Usuarios::Medico.where("login LIKE ? AND CONCAT_WS(' ', nome, sobrenome) LIKE ? AND ativo = 1",
                                        "%#{params[:filtro][:login]}%", "%#{params[:filtro][:nome]}%")
                                 .paginate(:page => params[:page], :per_page => 10).order('login')

      #Usuarios::Medico.where(:id => 1).find_all {|medico| medico.permissoes.find_all {|permissao| permissao.notificar}}

      @filtro_params = {:login => params[:filtro][:login], :nome => params[:filtro][:nome]}
    else
      @medicos = Usuarios::Medico.where(:ativo => true).paginate(:page => params[:page], :per_page => 10).order('login')
    end
  end
  
  def remover
    @medico = Usuarios::Medico.buscar_ativos(:id => params[:id]).first
    if @medico
      if @medico.remover
        Log.create(:login => @usuario_logado.login, :mensagem => t('usuarios/medico.remove_success') + " (#{@medico.login})")
        flash[:notice] = t('usuarios/medico.remove_success')
      else
        flash[:alert] = t('usuarios/medico.remove_fail')
      end
    else
      flash[:alert] = t('usuarios/medico.not_found')
    end
    redirect_to :action => :listar
  end
  
  def visualizar
    # Controle para que o paciente só seja capaz de visualizar seus dados
    if @medico_logado
      @medico = @medico_logado
    else
      @medico = Usuarios::Medico.buscar_ativos(:id => params[:id]).first
    end

    if @medico
      @medico.confirmacao_senha = @medico.senha
      foto_path = Rails.root.join("app", "assets", "images", "medicos", "foto_medico_#{@medico.id}.jpg")
      @foto_ext = "jpg"
      if not File.exist?(foto_path)
        foto_path = Rails.root.join("app", "assets", "images", "medicos", "foto_medico_#{@medico.id}.png")
        @foto_ext = "png"
        if not File.exist?(foto_path)
          @foto_ext = ""
        end
      end
    else
      flash[:alert] = t('usuarios/medico.not_found')
      redirect_to :action => :listar
    end
  end

end
